﻿/*
 * Copyright (c) 2011, The Chancellor, Masters and Scholars of the University of Oxford
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are 
 * permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice, this list of 
 *   conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright notice, this list 
 *   of conditions and the following disclaimer in the documentation and/or other 
 *   materials provided with the distribution.
 *
 * Neither the name of University of Oxford nor the names of its contributors may be used
 * to endorse or promote products derived from this software without specific prior 
 * written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Linq;
using System.Xml.Linq;


namespace Vreci.Metadata.Annotation
{
    public static class InkPresenterUtil
    {
        public static XNamespace xmlnsAnnotation = "http://vreci/annotation/1/";
        public static XDocument StrokesToXml(StrokeCollection strokes)
        {
            XElement sc = new XElement(xmlnsAnnotation + "StrokeCollection");
            foreach (var s in strokes)
            {
                if (s.StylusPoints.Count == 0)
                    continue;

                XElement stroke = new XElement(xmlnsAnnotation + "Stroke",
                                        new XAttribute("Colour", s.DrawingAttributes.Color),
                                        new XAttribute("OutlineColour", s.DrawingAttributes.OutlineColor),
                                        new XAttribute("Width", s.DrawingAttributes.Width),
                                        new XAttribute("Height", s.DrawingAttributes.Height)
                                   );
                XElement points = new XElement(xmlnsAnnotation + "Points");
                foreach (var p in s.StylusPoints)
                {
                    XElement point = new XElement(xmlnsAnnotation + "Point",
                                        new XAttribute("X", p.X),
                                        new XAttribute("Y", p.Y)
                                     );
                    points.Add(point);
                }
                stroke.Add(points);
                sc.Add(stroke);
            }

            return new XDocument(sc);
        }

        public static XDocument ToXml(this StrokeCollection strokes)
        {
            return StrokesToXml(strokes);
        }

        public static StrokeCollection XmlToStrokes(XDocument xstrokes)
        {
            StrokeCollection sc = new StrokeCollection();
            var strokes = from s in xstrokes.Root.Elements(xmlnsAnnotation + "Stroke") 
                          select s;
            foreach (var s in strokes)
            {
                Stroke stroke = new Stroke();
                if (s.Attribute("Colour") != null && !string.IsNullOrWhiteSpace(s.Attribute("Colour").Value))
                {
                    string colour = s.Attribute("Colour").Value;
                    stroke.DrawingAttributes.Color = Color.FromArgb(
                                                        Convert.ToByte(colour.Substring(1, 2), 16),
                                                        Convert.ToByte(colour.Substring(3, 2), 16),
                                                        Convert.ToByte(colour.Substring(5, 2), 16),
                                                        Convert.ToByte(colour.Substring(7, 2), 16)
                                                     );
                }
                if (s.Attribute("OutlineColour") != null && !string.IsNullOrWhiteSpace(s.Attribute("Colour").Value))
                {
                    string colour = s.Attribute("OutlineColour").Value;
                    stroke.DrawingAttributes.OutlineColor = Color.FromArgb(
                                                                Convert.ToByte(colour.Substring(1, 2), 16),
                                                                Convert.ToByte(colour.Substring(3, 2), 16),
                                                                Convert.ToByte(colour.Substring(5, 2), 16),
                                                                Convert.ToByte(colour.Substring(7, 2), 16)
                                                             );
                }
                if (s.Attribute("Width") != null && !string.IsNullOrWhiteSpace(s.Attribute("Width").Value))
                {
                    stroke.DrawingAttributes.Width = Convert.ToInt32(s.Attribute("Width").Value);
                }
                if (s.Attribute("Height") != null && !string.IsNullOrWhiteSpace(s.Attribute("Height").Value))
                {
                    stroke.DrawingAttributes.Width = Convert.ToInt32(s.Attribute("Height").Value);
                }
                (
                     from p in s.Descendants(xmlnsAnnotation + "Point")
                     select new StylusPoint()
                            {
                                X = Convert.ToDouble(p.Attribute("X").Value),
                                Y = Convert.ToDouble(p.Attribute("Y").Value)
                            }
                ).ToList().ForEach(stroke.StylusPoints.Add);

                sc.Add(stroke);
            }
            return sc;
        }
    }
}
